import logging
import os
from datetime import datetime
from logging.handlers import RotatingFileHandler # 导入日志文件处理器
from logging.handlers import TimedRotatingFileHandler #


def setup_logger(log_dir="logs", log_filename=None):
    """
    设置日志记录器，支持同时输出到文件和控制台。
    :param log_dir: 日志文件存储的目录，默认为 "logs"
    :param log_filename: 日志文件名，默认为当前日期时间
    :return: 配置好的 logger 对象
    """
    # 如果目录不存在，创建目录
    if not os.path.exists(log_dir):
        os.makedirs(log_dir)

    # 如果没有提供日志文件名，使用当前日期时间作为默认文件名
    if log_filename is None:
        log_filename = datetime.now().strftime("%Y-%m-%d_%H-%M-%S") + ".log"
        # print(log_filename)

    # 完整的日志文件路径
    log_filepath = os.path.join(log_dir, log_filename)

    # 创建 logger 对象
    logger = logging.getLogger("MyLogger")
    logger.setLevel(logging.DEBUG)  # 设置全局日志级别为 DEBUG

    # 创建文件处理器，用于写入日志文件
    # file_handler = logging.FileHandler(log_filepath, encoding="utf-8")
    # file_handler.setLevel(logging.INFO)  # 文件日志级别为 INFO

    # 文件处理器，设置日志文件大小和备份文件数量
    max_bytes = 5 * 1024 * 1024  # 5MB
    backup_count = 5  # 最多备份5个文件
    file_handler = RotatingFileHandler(log_filepath, maxBytes=max_bytes, backupCount=backup_count, encoding="utf-8")

    # 定时文件处理器，设置每天凌晨0点创建新的日志文件
    # file_handler = TimedRotatingFileHandler(log_filepath, when="midnight", interval=1, backupCount=backup_count, encoding="utf-8")

    # 定时文件处理器，设置每隔1小时创建新的日志文件
    # file_handler = TimedRotatingFileHandler(log_filepath, when="H", interval=1, backupCount=backup_count, encoding="utf-8")

    # 创建控制台处理器，用于输出到控制台
    console_handler = logging.StreamHandler()
    console_handler.setLevel(logging.DEBUG)  # 控制台日志级别为 DEBUG


    # 创建日志格式,可设置时间格式，datefmt="%Y-%m-%d %H-%M-%S"
    formatter = logging.Formatter(
        "%(process)d %(thread)d %(asctime)s [%(levelname)s] %(module)s - %(message)s"
    )
    file_handler.setFormatter(formatter) # 设置文件处理器的格式
    console_handler.setFormatter(formatter) # 设置控制台处理器的格式


    # 将处理器添加到 logger
    logger.addHandler(file_handler)
    logger.addHandler(console_handler)

    return logger


# # 示例用法
# if __name__ == "__main__":
#     logger = setup_logger()
#     logger.debug("这是一个调试信息")
#     logger.info("这是一个普通信息")
#     logger.warning("这是一个警告信息")
#     logger.error("这是一个错误信息")
#     logger.critical("这是一个严重错误信息")